home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C ++ / Frameworks / MacZoop 1.6.5 / Basic Classes / Z Sources / ZComrade.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-17  |  6.7 KB  |  276 lines  |  [TEXT/CWIE]

  1. /*************************************************************************************************
  2. *
  3. *
  4. *            ObjectMacZapp    -- a standard Mac OOP application template
  5. *
  6. *
  7. *
  8. *            ZComrade.cpp    -- an object that can maintain loose links between objects
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *            © 1996, Graham Cox
  15. *
  16. *
  17. *
  18. *
  19. *************************************************************************************************/
  20.  
  21.  
  22. #include    "ZComrade.h"
  23. #include    "ZObjectArray.cpp"
  24.  
  25. #include    "MacZoop.h"
  26.  
  27.  
  28. // this is a fudge to get around a limitation of the language- ZComrade requires ZObjectArray
  29. // for its lists, but ZObjectArray IS a ZComrade. Thus, since we are not allowed forward/
  30. // circular cross-dependencies like this, this struct is used to "pull" the declaration forward
  31. // so that everything compiles correctly.
  32.  
  33. struct ZComradeList : ZObjectArray<ZComrade>
  34. {
  35. };
  36.  
  37. /*---------------------------------***  CONSTRUCTOR  ***--------------------------------*/
  38.  
  39.  
  40. ZComrade::ZComrade()
  41. {
  42.     talkers = listeners = NULL;
  43. }
  44.  
  45. /*---------------------------------***  DESTRUCTOR  ***---------------------------------*/
  46.  
  47. ZComrade::~ZComrade()
  48. {
  49.     // when we are destroyed, we need to make sure that we remove ourselves
  50.     // from any talker's list that we are part of, and make sure that any listeners
  51.     // that are listening to us no longer do so.
  52.     
  53.     long        n;
  54.     ZComrade*    aComrade;
  55.     
  56.     if( listeners )
  57.     {
  58.         n = listeners->CountItems();
  59.         
  60.         do
  61.         {
  62.             aComrade = listeners->GetObject( n );
  63.             
  64.             if( aComrade )
  65.                 aComrade->RemoveTalker( this );
  66.         }
  67.         while( --n );
  68.         
  69.         ForgetObject( listeners );
  70.     }
  71.     
  72.     if( talkers )
  73.     {
  74.         n = talkers->CountItems();
  75.         
  76.         do
  77.         {
  78.             aComrade = talkers->GetObject( n );
  79.             
  80.             if( aComrade )
  81.                 aComrade->RemoveListener( this );
  82.         }
  83.         while( --n );
  84.     
  85.         ForgetObject( talkers );
  86.     }
  87. }
  88.  
  89.  
  90. /*--------------------------------***  SENDMESSAGE  ***---------------------------------*/
  91. /*    
  92. transmit a message to anyone who is listening
  93. ----------------------------------------------------------------------------------------*/
  94.  
  95. void        ZComrade::SendMessage( long aMessage, void* msgData )
  96. {
  97.     // send the message to all of the listeners of this object
  98.  
  99.     long        n;
  100.     ZComrade*    aListener;
  101.     
  102.     if( listeners )
  103.     {
  104.         n = listeners->CountItems();
  105.         
  106.         do
  107.         {
  108.             aListener = listeners->GetObject( n );    
  109.             
  110.             if( aListener )
  111.                 aListener->ReceiveMessage( this, aMessage, msgData );
  112.         }
  113.         while( --n );    
  114.     }
  115. }
  116.  
  117. /*--------------------------------***  SENDMESSAGE  ***---------------------------------*/
  118. /*    
  119. transmit a message to anyone who is listening (via a message object)
  120. ----------------------------------------------------------------------------------------*/
  121.  
  122. void        ZComrade::SendMessage( ZMessage* aMessage )
  123. {
  124.     // send the message object to all of the listeners of this object
  125.     
  126.     long        n;
  127.     ZComrade*    aListener;
  128.     
  129.     if( listeners )
  130.     {
  131.         n = listeners->CountItems();
  132.         
  133.         do
  134.         {
  135.             aListener = listeners->GetObject( n );    
  136.             
  137.             if( aListener )
  138.                 aListener->ReceiveMessage( this, aMessage );
  139.         }
  140.         while( --n );    
  141.     }
  142. }
  143.  
  144.  
  145. /*-------------------------------***  RECEIVEMESSAGE  ***-------------------------------*/
  146. /*    
  147. a message was transmitted by someone we have earlier elected to listen to
  148. ----------------------------------------------------------------------------------------*/
  149.  
  150. void        ZComrade::ReceiveMessage( ZComrade* aSender, long theMessage, void* msgData )
  151. {
  152.     // override to do something useful
  153. }
  154.  
  155.  
  156. /*------------------------------***  RECEIVEMESSAGE  ***--------------------------------*/
  157. /*    
  158. receive a message in a message object from one of our transmitting comrades
  159. ----------------------------------------------------------------------------------------*/
  160.  
  161. void        ZComrade::ReceiveMessage( ZComrade* aSender, ZMessage* aMessage )
  162. {
  163.     // override to do something useful
  164. }
  165.  
  166. /*---------------------------------***  LISTENTO  ***-----------------------------------*/
  167. /*    
  168. elect to listen to another comrade. We will receive any messages transmitted by that
  169. object whenever it sends them
  170. ----------------------------------------------------------------------------------------*/
  171.  
  172. void        ZComrade::ListenTo( ZComrade* aSender )
  173. {
  174.     // add this to the sender's list of listeners, and the sender to our list of talkers
  175.     
  176.     FailOSErr((aSender == NULL)? paramErr : noErr );
  177.     
  178.     // make sure we are not already listening to this one- references must be
  179.     // included exactly once
  180.     
  181.     if(( talkers == NULL ) || !talkers->Contains( aSender ))
  182.     {
  183.         aSender->AddListener( this );
  184.         AddTalker( aSender );
  185.     }
  186. }
  187.  
  188.  
  189. /*-----------------------------***  STOPLISTENINGTO  ***-------------------------------*/
  190. /*    
  191. we no longer want to receive messages from this transmitter
  192. ----------------------------------------------------------------------------------------*/
  193.  
  194. void        ZComrade::StopListeningTo( ZComrade* aSender )
  195. {
  196.     // remove this from the sender's list of listeners, and remove it from our list of talkers
  197.     
  198.     FailOSErr((aSender == NULL)? paramErr : noErr );
  199.     
  200.     // make sure we are really listening to it
  201.     
  202.     if (talkers && talkers->Contains( aSender ))
  203.     {
  204.         RemoveTalker( aSender );
  205.         aSender->RemoveListener( this );
  206.     }
  207. }
  208.  
  209.  
  210. /*---------------------------------***  ADDTALKER  ***----------------------------------*/
  211. /*    
  212. add a talker to our list of talkers
  213. ----------------------------------------------------------------------------------------*/
  214.  
  215. void        ZComrade::AddTalker( ZComrade* aTalker )
  216. {
  217.     // add the talker to the list of talkers
  218.     
  219.     if (talkers == NULL)
  220.         FailNIL( talkers = new ZComradeList());
  221.         
  222.     talkers->AppendItem( aTalker );
  223. }
  224.  
  225. /*-------------------------------***  ADDLISTENER  ***----------------------------------*/
  226. /*    
  227. add a listener to our list of listeners
  228. ----------------------------------------------------------------------------------------*/
  229.  
  230. void        ZComrade::AddListener( ZComrade* aListener )
  231. {
  232.     // add the listener to the list of listeners
  233.     
  234.     if (listeners == NULL)
  235.         FailNIL( listeners = new ZComradeList());
  236.         
  237.     listeners->AppendItem( aListener );
  238. }
  239.  
  240.  
  241. /*--------------------------------***  REMOVETALKER  ***--------------------------------*/
  242. /*    
  243. remove the talker from our list of talkers
  244. ----------------------------------------------------------------------------------------*/
  245.  
  246. void        ZComrade::RemoveTalker( ZComrade* aTalker )
  247. {
  248.     // remove this talker from the list of talkers
  249.     
  250.     if( talkers )
  251.     {
  252.         talkers->DeleteObject( aTalker );
  253.         
  254.         if( talkers->CountItems() <= 0 )
  255.             ForgetObject( talkers );
  256.     }
  257. }
  258.  
  259.  
  260. /*-------------------------------***  REMOVELISTENER  ***-------------------------------*/
  261. /*    
  262. remove the listener from our list of listeners
  263. ----------------------------------------------------------------------------------------*/
  264.  
  265. void        ZComrade::RemoveListener( ZComrade* aListener )
  266. {
  267.     // remove this listener from the list of listeners
  268.     
  269.     if( listeners )
  270.     {
  271.         listeners->DeleteObject( aListener );
  272.         
  273.         if( listeners->CountItems() <= 0 )
  274.             ForgetObject( listeners );
  275.     }
  276. }